#pragma once

#include <iostream>
#include <unordered_map>
#include <functional>
#include <ctime>
using namespace std;

using task_t = function<void()>;

void Download()
{
    cout<<"我是下载任务....."<<endl;
}

void Log()
{
    cout<<"我是日志任务....."<<endl;
}

void Sql()
{
    cout<<"我是数据库同步任务....."<<endl;
}

static int number = 0;
class TaskManager
{
public:
    TaskManager(){
        //
        srand(time(nullptr));
        InsertTask(Download);
        InsertTask(Log);
        InsertTask(Sql);
    }
    ~TaskManager(){}
    //插入任务
    void InsertTask(task_t t)
    {
        //number表示有多少个任务
        tasks[number++]=t;
    }
    //选择任务
    int SelectTask()
    {
        //选择一个任务
        return rand() % number;
    }
    //执行任务
    void Excute(int number)
    {
        //没找到说明方法是空的
        if(tasks.find(number) == tasks.end()) return;
        //找到了执行这个方法
        tasks[number]();
    }
private:
    //int(任务码)--->任务种类
    unordered_map<int,task_t> tasks;
};

TaskManager tmp;

//函数作用：传进来的参数不对，这个函数就告诉我们如何传递参数
void Usage(string proc)
{
    cout<<"Usage: "<<proc<<"process-num"<<endl;
}

void Worker()
{
    while(true)
    {
        int cmd = 0;
        int n = read(0,&cmd,sizeof(cmd));
        if(n == sizeof(cmd)) tmp.Excute(cmd);
        else if(n == 0)//写端关闭
        {
            cout<<"pid: "<<getpid()<<"quit..."<<endl;
            break;
        }
        else//读取失败
        {
            
        }
    }
}